package show.hkl.code_migrate.project;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ClassPathResource;

import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;


/**
 * <p>
 * 读取项目文件类
 *
 * @author hkl
 * @version 1.0
 * @date 2021/3/15 15:46
 * </p>
 */
public class ReadProjectFile {

    /**
     * 项目绝对路径
     */
    private static String projectPath = null;

    /**
     * 项目忽略文件夹
     */
    private static List<String> projectPathIgnores = null;

    /**
     * 分析文件列表
     */
    private static List<File> analysisFileList = null;

    /**
     * 分析文件名<=>文件映射映射关联
     */
    private static Map<String, File> analysisFileMap = null;

    /**
     * Java类型分析文件名<=>文件映射映射关联
     */
    private static Map<String, File> analysisJavaTypeFileMap = null;

    static {
        ClassPathResource resource = new ClassPathResource("config.properties");
        Properties properties = new Properties();
        try {
            properties.load(resource.getStream());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        projectPath = properties.getProperty("projectPath");
        String projectPathIgnore = properties.getProperty("projectPathIgnore");

        // 忽略文件集合
        projectPathIgnores = Arrays.asList(projectPathIgnore.split(",")).stream().collect(Collectors.toList());
    }

    /**
     * 获取分析目录文件
     *
     * @return 对应的分析工程目录下所有的文件引用, 是有顺序的列表
     */
    public static List<File> getAnalysisDirectoryFile() {
        if (analysisFileList != null) {
            return analysisFileList;
        }

        analysisFileList = FileUtil.loopFiles(projectPath, file -> {
            for (String ignore : projectPathIgnores) {
                // 判断该文件是否是忽略文件
                boolean contains = file.getPath().contains(ignore);

                // 是忽略文件直接结束当前lambada表达式
                if (contains) {
                    return false;
                }
            }
            return true;
        });

        return analysisFileList;
    }

    /**
     * 获取文件名<=>文件映射映射关联
     *
     * @return 对应的分析工程目录下所有的文件名<=>文件映射映射关联, 是有顺序的列表
     */
    public static Map<String, File> getFileAndFileNameMapping() {
        if (analysisFileMap != null) {
            return analysisFileMap;
        }

        loadFileNameMapping();

        return analysisFileMap;
    }

    /**
     * 获取Java类型的文件映射集合
     *
     * @return
     */
    public static Map<String, File> getJavaTypeFileAndFileNameMapping() {
        if (analysisJavaTypeFileMap != null) {
            return analysisJavaTypeFileMap;
        }

        loadFileNameMapping();

        return analysisJavaTypeFileMap;
    }

    /**
     * 加载文件映射
     */
    private static void loadFileNameMapping() {
        analysisFileMap = new LinkedHashMap<>();
        analysisJavaTypeFileMap = new LinkedHashMap<>();
        List<File> analysisDirectoryFile = getAnalysisDirectoryFile();

        analysisDirectoryFile.forEach(file -> {
            String filePath = file.getPath();
            analysisFileMap.put(filePath, file);

            if (filePath.endsWith(".java")) {
                analysisJavaTypeFileMap.put(filePath, file);
            }
        });
    }


}
